package org.lql.algo.codecrush.week005;

import org.lql.algo.common.ListNode;

/**
 * @author: liangqinglong
 * @date: 2025-08-05 17:54
 * @description: LCR 142. 训练计划 IV <a href="https://leetcode.cn/problems/he-bing-liang-ge-pai-xu-de-lian-biao-lcof/description/">...</a>
 **/
public class TrainningPlanIV {

	/**
	 * 给定两个以 有序链表 形式记录的训练计划 l1、l2，分别记录了两套核心肌群训练项目编号，请合并这两个训练计划，按训练项目编号 升序 记录于链表并返回。
	 * <p>
	 * 注意：新链表是通过拼接给定的两个链表的所有节点组成的。
	 * <p>
	 * <p>
	 * <p>
	 * 示例 1：
	 * <p>
	 * 输入：l1 = [1,2,4], l2 = [1,3,4]
	 * 输出：[1,1,2,3,4,4]
	 * 示例 2：
	 * <p>
	 * 输入：l1 = [], l2 = []
	 * 输出：[]
	 * 示例 3：
	 * <p>
	 * 输入：l1 = [], l2 = [0]
	 * 输出：[0]
	 * <p>
	 * <p>
	 * 提示：
	 * <p>
	 * 0 <= 链表长度 <= 1000
	 */
	public ListNode trainningPlan(ListNode l1, ListNode l2) {
		ListNode dummy = new ListNode(0); // 哑节点
		ListNode curr = dummy;

		while (l1 != null && l2 != null) {
			if (l1.val < l2.val) {
				curr.next = l1; // 复用 l1 节点
				l1 = l1.next;
			} else {
				curr.next = l2; // 复用 l2 节点
				l2 = l2.next;
			}
			curr = curr.next;
		}

		// 将剩余部分接上
		if (l1 != null) {
			curr.next = l1;
		}
		if (l2 != null) {
			curr.next = l2;
		}

		return dummy.next;
	}

	public static void main(String[] args) {
		TrainningPlanIV mergeTwoLists = new TrainningPlanIV();
		ListNode l1 = new ListNode(1);
		l1.next = new ListNode(2);
		l1.next.next = new ListNode(4);
		ListNode l2 = new ListNode(1);
		l2.next = new ListNode(3);
		l2.next.next = new ListNode(4);
		ListNode listNode = mergeTwoLists.trainningPlan(l1, l2);
		ListNode.printList(listNode);
	}
}
